﻿/*===========================================================================================
 *  作者 xingcent
 *
 * ===========================================================================================
 */







#if _MSC_VER >= 1600
#pragma execution_character_set("UTF-8")
#endif
#ifndef WIDGET_H
#define WIDGET_H

#include <QMainWindow>
#include<QPushButton>
#include<QMediaPlayer>
#include<QDial>
#include<QProgressBar>
#include<QSlider>
#include<QDragEnterEvent>
#include<QDropEvent>
#include<QIcon>
#include<memory>
#include<QLineEdit>
#include<QLabel>
#include<QPlainTextEdit>
#include<QWidget>
#include<QVideoWidget>
#include<QStandardItemModel>
#include<QTableView>
#include<QHeaderView>
#include<QFileDialog>
#include<QMainWindow>
#include<QCloseEvent>
#include<QKeyEvent>

namespace xingcent_player {



 // 显示播放列表


// UI 布局
class XingcentPlayerUi:public QMainWindow{

public:
    XingcentPlayerUi(QWidget * parent = nullptr);

    XingcentPlayerUi(const XingcentPlayerUi & i ) =delete;
    XingcentPlayerUi & operator =(const XingcentPlayerUi &)=delete;
    XingcentPlayerUi(XingcentPlayerUi &&)=delete;
    XingcentPlayerUi & operator =(XingcentPlayerUi &&)=delete;
    virtual ~XingcentPlayerUi() =default;       // 虚的虚构函数

protected:
    std::shared_ptr<QMediaPlayer>m_player;
    //QMediaPlayer*m_player;      // 播放器的控制
    QSlider m_dial;             //   调节音量
    QPushButton m_pre;          //   播放 播放列表的上一条目
    QPushButton m_pause;        //   暂停播放按钮
    QPushButton m_next;         //   播放播放列表的下一条目
    QSlider m_bar;              //   显示播放的进度条
    QLabel m_time;              //   显示播放的 当前进度 - 总的时间 （有可能会出现容错）
    QLabel m_nowTitle;          //   显示正在播放的文件的标题
    QVideoWidget m_videoPlay;   //   播放视频的区域
    QTableView m_view;          //   table 容器
    QPushButton m_search;       //   搜索列表
    QLineEdit m_text;           //   搜索框输入项
    QStandardItemModel  head  ; //   显示播放列表的头
    QLabel m_image;             //   显示图片
    QLabel m_lyr;               //  显示歌词
    QPushButton m_mute;         //   静音按钮

    QTabWidget * tabWidget =new QTabWidget;     //tab 布局


private:
    void playerAndroidLayout();     // android 的布局
    void playerWinLayout();         // window 平台的布局

    void initialStutusBar();        // 初始化状态栏

    void initialUi();               // 初始化 UI

    void initialLyr();





};                                  // XingcentPlayerUi定义完毕


class Widget : public XingcentPlayerUi
{
    Q_OBJECT

public:
    Widget(XingcentPlayerUi *parent = 0);       //
   virtual  ~Widget();


private slots:

    void onPre();                       //  上一曲
    void onPause();                     // 暂停
    void onNext();                      // 下一曲
    void onValChange(int vol);          // 调节音量
    void onPositionChange(qint64 num);  //
    void onBarPositionChange(int num);
    int onBarChange();                  //????
    void onAutoNext();                  //自动播下一曲的操作 ToolTips

    void setPosition(int position); //  拖动进度条

    void setIndex(int index);
    void searchM();                 // 搜索当前的播放列表
    void openFileDialog();
    void onDoubleClickTheContent(const QModelIndex &index);     // 双击选中播放列表的某个曲目
    void onSizeChange();
    void changeImage(QMediaPlayer::MediaStatus status);
    void changeImage(QMediaContent content);
    void onMute();
    void setViewCurrentIndex(int index);
protected:
    // 重写的拖放操作
    virtual void dragEnterEvent(QDragEnterEvent *e) override; //重写的拖动
    virtual void dropEvent(QDropEvent *e) override;     // 重写的drop
    void closeEvent(QCloseEvent *evnet) override;
    void keyPressEvent(QKeyEvent *event)override;
private:

    void initialStatusBar();                          //

    std:: vector<QString>  readList(QString fileName);  // 返回文件列表

    void writeFile(QString fileName, QString path); // 把path 添加到 data.txt
    QString getBaseName(QString fil);               // 获取 baseName
    bool existFile(QString fileName, QString path);  // 判断是否已经存在了 和path 相同路径的文件

    int fileLocal(QString fileName, QString path); // ????????

    int containFile(QString fileName, QString name);   // ??????????

    void updateList(QString fileName);              // 更新播放列表

    void setConnect();                      // 信号和槽的链接
    void checkToDisplay();              // 检查当前播放的内容是音频还是视频
                                        // 如果是视频切换至Mv 否则切到列表
    void changeMnowTitle();

private:



};


    inline QString getU(){
        return "helloXingcent_Player";
    }

    inline QString getInfoAboutThis(){
        return "This is namespace of xingcentPlayer";
    }
}

#endif // WIDGET_H
